<!-- 单个下载文件 -->
<template>
  <a href="#" @click="handleDownload"><i class="bi bi-download"></i></a>
</template>

<script>
import axios from "axios";
// 用正则截取字符串
function extractFileName(inputString) {
  // 匹配 'utf-8'' 之后的内容，直到字符串结束
  const regex = /utf-8''(.*)/;
  const matches = inputString.match(regex);

  if (matches && matches[1]) {
    // matches[1] 包含 'utf-8'' 之后的所有内容，即我们想要的文件名
    return matches[1];
  } else {
    // 如果没有匹配到，则返回原始输入或适当的默认值
    return inputString; // 或者你可以返回一个默认文件名
  }
}

// 根据Content-Type获取默认扩展名的函数
function getDefaultExtension(contentType) {
  switch (contentType) {
    case "application/pdf":
      return ".pdf";
    case "image/jpeg":
      return ".jpg";
    case "image/png":
      return ".png";
    case "XLS":
      return ".xls";
    case "XLSX":
      return ".xlsx";
    case "DOC":
      return ".doc";
    case "DOCX":
      return ".docx";
    case "PPT":
      return ".ppt";
    case "PPTX":
      return ".pptx";
    case "TEXT":
      return ".txt";
    case "ZIP":
      return ".zip";
    case "TAR":
      return ".tar";
    case "GZ":
      return ".gz";
    case "7Z":
      return ".7z";
    case "RAR":
      return ".rar";
    case "JAR":
      return ".jar";
    case "AUDIO":
      return ".mp3";
    case "VIDEO":
      return ".mp4";
    // ... 添加其他MIME类型和对应的扩展名
    default:
      return ".bin"; // 默认使用.bin作为未知类型的扩展名
  }
}

function ensureFileExtension(filename_old, contentType) {
  // 检查文件名是否已经有后缀
  const dotIndex = filename_old.lastIndexOf(".");
  if (dotIndex === -1 || dotIndex === filename_old.length - 1) {
    // 没有后缀，或者后缀是文件名的最后一个字符（这通常不是一个有效的后缀）
    // 添加默认后缀
    return filename_old + getDefaultExtension(contentType);
  } else {
    // 已经有后缀，不做修改
    return filename_old;
  }
}
export default {
  props: {
    fileId: {
      type: Number,
      required: true,
    },
    source: {
      type: String, // 假设 source 是一个字符串
      default: "", // 设置默认值以防万一
    },
  },
  methods: {
    async handleDownload() {
      // 注意这里移除了 fileId 参数
      try {
        // 构造带有查询参数的URL
        const params = new URLSearchParams();
        params.append("fileId", this.fileId.toString()); // 确保fileID是字符串格式
        params.append("source", this.source);

        const urlWithParams = `/api/download/file?${params.toString()}`;
        const response = await axios({
          method: "get",
          url: urlWithParams, // 包含查询参数的URL
          responseType: "blob", // 告诉axios我们期望返回的是一个blob对象
        });
        if (
          typeof response.data === "string" ||
          response.data instanceof Blob
        ) {
          // 获取返回的文件类型
          const contentType = response.headers["content-type"];
          console.log(contentType); // 输出Content-Type的值，例如: 'application/json'
          // 创建一个blob对象
          const url = window.URL.createObjectURL(new Blob([response.data]));

          // 创建一个a标签用于下载
          const link = document.createElement("a");
          link.href = url;

          // 注意：这里假设后端返回了正确的 Content-Disposition 头部
          // 如果后端没有返回，您需要设置一个默认的文件名

          let disposition = {};
          let temp = response.headers["content-disposition"].split("; ");
          for (let i in temp) {
            disposition[temp[i].split("=")[0]] = temp[i].split("=")[1];
          }

          console.log(disposition);
          console.log(decodeURI(disposition["filename*"]));
          const filename_old = response.headers["content-disposition"]
            ? decodeURIComponent(decodeURI(disposition["filename*"]))
            : `file-${this.fileId}.ext`; // 假设扩展名为 .ext，或者您可以根据 file_type 设置
          const filename_new = ensureFileExtension(filename_old, contentType);
          let fileName = extractFileName(filename_new);
          link.setAttribute("download", fileName);
          document.body.appendChild(link);

          // 触发下载
          link.click();

          // 然后移除a标签
          document.body.removeChild(link);
          window.URL.revokeObjectURL(url); // 释放创建的 URL 对象
        } else if (typeof response.data === "object") {
          // 假设后端返回了一个JSON对象作为错误信息
          alert(response.data.message); // 显示JSON响应中的message属性
          return; // 退出方法，因为我们已经处理了错误情况
        } else {
          // 其他情况，可能是一个未知的响应类型
          alert("下载文件时发生未知错误");
          return;
        }
      } catch (error) {
        console.error("下载文件时出错:", error);
        // 检查错误响应是否包含message属性，并显示alert
        if (
          error.response &&
          error.response.data &&
          error.response.data.message
        ) {
          alert(error.response.data.message); // 显示错误响应中的message属性
        } else {
          alert("下载文件时发生未知错误"); // 如果没有找到message属性，显示默认错误消息
        }
      }
    },
  },
};
</script>

<style scoped></style>
